package com.liming.coupon.client;

import com.liming.common.pojo.dto.coupon.CouponValidDTO;
import com.liming.common.pojo.dto.coupon.UserHomeCouponPageQuery;
import com.liming.common.pojo.dto.order.user.mini.MiniOrderSelectCouponDTO;
import com.liming.common.pojo.entity.coupon.Coupon;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.coupon.openfeign.*;
import com.liming.common.pojo.vo.order.openfeign.mini.FeignMiniOrderSelectCouponVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 优惠券客户端 - 用户
 *
 * @author liming
 * @date 2025/1/6
 */
@FeignClient(value = "coupon-service", contextId = "couponUserClient", path = "/service/coupon_user")
public interface CouponUserClient {

    /**
     * 用户领取优惠券
     *
     * @param id 优惠券ID
     * @return 是否领取成功
     */
    @PostMapping("get/{id}")
    Boolean get(@PathVariable Long id);

    /**
     * 检查优惠券是否可用
     *
     * @param couponValidDTO 优惠券检验参数
     * @return 是否可用
     */
    @PostMapping("check_available")
    Coupon checkAvailable(@RequestBody CouponValidDTO couponValidDTO);

    /**
     * 获取所有商品能够使用的最好的优惠券 满减券、折扣券
     *
     * @param productIdAndPriceMap 商品的Map<id、价格>
     * @return Map<商品id, 商品可使用的最好的优惠券列表>
     */
    @PostMapping("product_can_use_coupons")
    Map<Long, List<FeignMiniCouponVO>> productCanUseCoupons(@RequestBody Map<Long, Integer> productIdAndPriceMap);

    /**
     * 商品详情页面 点击查看优惠券详情列表
     *
     * @param couponIds 优惠券IDS
     * @return 优惠券详情列表
     */
    @PostMapping("coupon_detail_list")
    List<FeignMiniProductUserCouponVO> couponDetailList(@RequestBody List<Long> couponIds);

    /**
     * 用户优惠券列表
     *
     * @return 用户优惠券列表
     */
    @GetMapping("user_have_coupons/{userId}")
    List<FeignMiniCouponVO> userHaveCoupons(@PathVariable Long userId);

    /**
     * 用户主页优惠券分页 - 小程序
     *
     * @param pageQuery 分页参数
     * @return 分页
     */
    @GetMapping("user_home_coupon_page")
    PageVO<FeignMiniUserHomeCouponVO> userHomeCouponPage(@SpringQueryMap UserHomeCouponPageQuery pageQuery);

    /**
     * 根据金额获取能使用的优惠券
     *
     * @param amount 金额
     * @return 可使用优惠券列表
     */
    @GetMapping("can_use_coupons_by_amount/{amount}")
    List<FeignMiniCanUseCouponVO> canUseCouponsByAmount(@PathVariable Integer amount);

    /**
     * 根据金额获取不能使用的优惠券
     *
     * @param amount 金额
     * @return 不可使用优惠券列表
     */
    @GetMapping("cannot_use_coupons_by_amount/{amount}")
    List<FeignMiniCannotUseCouponVO> cannotUseCouponsByAmount(@PathVariable Integer amount);

    /**
     * 用户在订单中 选择优惠券
     *
     * @param dto 优惠券选择参数
     * @return 优惠券选择结果
     */
    @PostMapping("select_coupon")
    FeignMiniOrderSelectCouponVO miniOrderSelectCoupon(@RequestBody MiniOrderSelectCouponDTO dto);

    /**
     * 用户在订单中 使用优惠券
     *
     * @param couponId 优惠券ID
     * @return 是否使用成功
     */
    @PutMapping("user_order_use_coupon/{couponId}")
    Boolean userOrderUseCoupon(@PathVariable Long couponId);

    /**
     * 订单支付失败 优惠券退还
     *
     * @param userId   用户ID
     * @param couponId 优惠券ID
     * @return 是否退还成功
     */
    @PutMapping("payment_failure/{userId}/{couponId}")
    Boolean paymentFailure(@PathVariable Long userId, @PathVariable Long couponId);
}
